package csu.webcourse.mypetstore.service;

import csu.webcourse.mypetstore.domain.Cart;
import csu.webcourse.mypetstore.domain.CartItem;
import csu.webcourse.mypetstore.domain.Item;
import csu.webcourse.mypetstore.persistence.CartDao;
import csu.webcourse.mypetstore.persistence.ItemDao;
import csu.webcourse.mypetstore.persistence.impl.CartDaoImpl;
import csu.webcourse.mypetstore.persistence.impl.ItemDaoImpl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Iterator;

public class CartService {

    private ItemDao itemDao;
    private CartDao cartDao;

    public CartService(){
        this.itemDao=new ItemDaoImpl();
        this.cartDao=new CartDaoImpl();
    }

    public void incrementQuantity(CartItem cartItem) {
        cartItem.setQuantity(cartItem.getQuantity() + 1);
        calculateTotal(cartItem);
    }

    private void calculateTotal(CartItem cartItem) {
        if (cartItem.getItem() != null && cartItem.getItem().getListPrice() != null) {
            cartItem.setTotal(cartItem.getItem().getListPrice().multiply(new BigDecimal(cartItem.getQuantity())));
        } else {
            cartItem.setItem(null);
        }
    }

    public Iterator<CartItem> getAllCartItems(Cart cart) {
        return cart.getCartItemList().iterator();
    }

    public boolean containsItemId(Cart cart, String itemId) {
        return cart.getItemMap().containsKey(itemId);
    }

    public void addItem(Cart cart, Item item, boolean isInStock) {
        CartItem cartItem = (CartItem) cart.getItemMap().get(item.getItemId());
        if (cartItem == null) {
            cartItem = new CartItem();
            cartItem.setItem(item);
            cartItem.setQuantity(0);
            cartItem.setInStock(isInStock);
            cart.getItemMap().put(item.getItemId(), cartItem);
            cart.getCartItemList().add(cartItem);
        }
        this.incrementQuantity(cartItem);
    }

    public Item removeItemById(Cart cart, String itemId) {
        CartItem cartItem = (CartItem) cart.getItemMap().remove(itemId);
        if (cartItem == null) {
            return null;
        } else {
            cart.getCartItemList().remove(cartItem);
            return cartItem.getItem();
        }
    }

    public void removeCartList(String userId){
        cartDao.removeCartList(userId);
    }

    public void removeCartListASYNC(String userId,String itemId){
        cartDao.removeCartListAsync(userId,itemId);
    }

    public void incrementQuantityByItemId(Cart cart, String itemId) {
        CartItem cartItem = (CartItem) cart.getItemMap().get(itemId);
        this.incrementQuantity(cartItem);
    }

    public void setQuantityByItemId(Cart cart, String itemId, int quantity) {
        CartItem cartItem = (CartItem) cart.getItemMap().get(itemId);
        cartItem.setQuantity(quantity);
        this.calculateTotal(cartItem);
    }

    public void insertCartList(String itemId,String userId){
        cartDao.insertCartList(itemId,userId);
    }

    public ArrayList<String> getCart(String userId){
        return cartDao.getCart(userId);
    }

    public BigDecimal getSubTotal(Cart cart) {
        BigDecimal subTotal = new BigDecimal("0");
        Iterator<CartItem> items = getAllCartItems(cart);
        while (items.hasNext()) {
            CartItem cartItem = (CartItem) items.next();
            Item item = cartItem.getItem();
            BigDecimal listPrice = item.getListPrice();
            BigDecimal quantity = new BigDecimal(String.valueOf(cartItem.getQuantity()));
            subTotal = subTotal.add(listPrice.multiply(quantity));
        }
        return subTotal;
    }
}
